package com.suncnpap.system.service.impl;

import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.app.util.database.mybatis.Page;
import com.app.util.database.mybatis.QueryType;
import com.suncnpap.system.mapper.MenuMapper;
import com.suncnpap.system.model.Menu;
import com.suncnpap.system.model.School;
import com.suncnpap.system.service.MenuService;

/** 
 * 说明： 菜单权限
 * 创建时间：2016-10-19
 * @version
 */
@Service("menuService")
public class MenuServiceImpl implements MenuService{

	@Autowired
	MenuMapper menuMapper;
	
	//@Autowired
	//RootUnitMenuMapper rootUnitMenuMapper;
	
	/**新增
	 * @param pd
	 * @
	 */
	@Override
	public void add(Menu obj){
		
		//获取最大值
		int maxSort = this.findMaxSortByParentId(obj.getStrParentId());
		obj.setIntSort(maxSort + 1);
		menuMapper.add(obj);
	}
	
	
	
	
	
	/**通过id获取数据
	 * @param pd
	 * @
	 */
	@Override
	public Menu findById(String strId){
		return (Menu)menuMapper.findById(strId);
	}
	

	/**
	 * 根据page查询所有信息
	 * chenl
	 */
	@Override
	public List<Menu> getList(Page page,String strSchoolId) {
		// TODO Auto-generated method stub
		if(page == null) {
			page = new Page();
		}
		if(page.getSort() == null || page.getSort().equals("")) {
			page.setSort("intSort");
			page.setOrder("asc");
		}
		
		if(!strSchoolId.equals("")){
			page.put("strSchoolId", strSchoolId);
		}
		return menuMapper.getList(page);
	}

	/**
	 * 根据strParentId查找最大序号
	 * chenl
	 */
	@Override
	public Integer findMaxSortByParentId(String strParentId) {
		// TODO Auto-generated method stub
		Integer maxSort = menuMapper.findMaxSortByParentId(strParentId);
		return maxSort == null ?0:maxSort;
	}

	/**
	 * 删除自身及其子集
	 * chenl
	 */
	@Override
	public void deleteAll(String strId) {
		// TODO Auto-generated method stub
		Menu menu = menuMapper.findById(strId);
		menuMapper.deleteById(strId);	//删除
		
		//同步删除独立单位下的菜单
		//rootUnitMenuMapper.deleteByMenuId(strId);
		
		//更新当前树枝上其他节点序号信息
		menuMapper.updateSortWhenDelete(menu.getStrParentId(),menu.getIntSort());
		
		//获取所有下级菜单
		List<Menu> list = listByParentId(strId);
		
		
		String[] ids = new String[list.size()];
		for(int i=0,len=list.size();i<len;i++){
			ids[i] = list.get(i).getStrId();
			
			//删除独立单位下的菜单
			//rootUnitMenuMapper.deleteByMenuId(ids[i]);
		}
		
		//删除所有ids
		if(ids.length > 0 ){
			menuMapper.deleteMore(ids);
		}
	}
	
	/**
	 * 获取当前节点下所有子信息
	 * strParentId为当前节点id,-1则是全部
	 * @param all入参，且是所有返回的信息
	 * @param strParentId
	 * chenl
	 */
	@Override
	public List<Menu> listByParentId(String strParentId){
		
		List<Menu> all = new ArrayList<Menu>();
		listByParentIdCircle(all,strParentId);
		return all;
	}
	
	private void listByParentIdCircle(List<Menu> all,String strParentId) {

		Page page = new Page();
		page.addQueryAnd("strParentId",QueryType.markEQ, strParentId);
		page.setSort("intSort");
		page.setOrder("asc");
		List<Menu> list = menuMapper.getList(page);
		if(list == null || list.size() == 0){
			return;
		}
		all.addAll(list);
		for(int i=0;i<list.size();i++){
			Menu menu = list.get(i);
			listByParentIdCircle(all,menu.getStrId());
		}
	}
	
	/**
	 * 获取所有子级的id
	 * chenl
	 * @param strId
	 * @return
	 */
	@Override
	public List<String> listIdsByParentId(String strId){
		
		//获取所有下级菜单
		List<Menu> list = this.listByParentId(strId);
		
		List<String> ids = new ArrayList<String>();
		for(Menu obj : list){
			ids.add(obj.getStrId());
		}
		return ids;
	}

	/**
	 * 更新同时更新序号
	 * chenl
	 * 
	 */
	@Override
	public void update(Menu obj) {
		// TODO Auto-generated method stub
		String strNowParentId = obj.getStrParentId();		//现在所在parentId
		String strOldParentId = obj.getStrOldParentId();	//
				
		//上级未改变
		if(strNowParentId.equals(strOldParentId)){
			if(obj.getIntSort().intValue() != obj.getIntOldSort().intValue()){	//序号改变，则更改其他
				menuMapper.updateSortWhenUpdate(obj);	
			}			
		}else{	//上级改变
			//在新的父节点下，添加最大序号
			obj.setIntSort(findMaxSortByParentId(obj.getStrParentId()) + 1);
			
			//原父节点下，则全部减少1
			menuMapper.updateSortWhenDelete(obj.getStrOldParentId(), obj.getIntOldSort());
		}
		menuMapper.edit(obj);
	}

	@Override
	public Menu findByUrl(String uri) {
		// TODO Auto-generated method stub
		
		Page page = new Page();
		page.addQueryAnd("strUrl", QueryType.markEQ, uri);
//		page.addQueryAnd("intVirDel", QueryType.markEQ, 0);
		List<Menu> list = menuMapper.getList(page);
		if(list != null && list.size() >0 ) {
			return list.get(0);
		}
		return null;
	}
	
	@Override
	public Page list(Page page) {
		// TODO Auto-generated method stub
		List<Menu> list = menuMapper.datalistPage(page);
		page.setDataList(list);
		return page;
	}
}

